<?php
//设计模式里面的命令模式也是SRP的体现，命令模式分离 命令的请求者和命令的实现者
/**
 * 厨师类,命令的接受者与执行者
*/
class cook{
    //番茄炒鸡蛋
    public function meal(){
        echo '番茄炒鸡蛋',PHP_EOL;
    }

    //紫菜蛋花汤
    public function drink(){
        echo '紫菜蛋花汤',PHP_EOL;
    }

    //饭做完了
    public function ok(){
        echo '完毕',PHP_EOL;
    }
}

//命令接口
interface Command{
    //命令接口
    public function execute();
}



//模拟服务员与厨师的过程
//服务员给厨师说给我做一个番茄炒鸡蛋的命令
class MealCommand implements Command{
    private $cook;
    //绑定命令的接受者
    //绑定厨师  参数属于厨师(cook)类
    public function __construct(cook $cook)
    {
        $this->cook = $cook;
    }

    

    //告诉厨师需要执行的命令
    public function execute()
    {
        $this->cook->meal();//把消息传递给厨师，让厨师做饭，下同
    }
}


//服务员给厨师说给我做一个紫菜蛋花汤的命令
class DrinkCommand implements Command{
    private $cook;
    //绑定命令接受者
    public function __construct(cook $cook)
    {   
        $this->cook = $cook;
    }

    public function execute()
    {
        $this->cook->drink();
    }
    
}



//现在客户可以按照菜单叫服务员了
//模拟客户与服务员的过程
class cookControl{
    //客户给服务员发送番茄炒鸡蛋的命令
    private $mealcommand;
    //客户给服务员发送紫菜蛋花汤的命令
    private $drinkcommand;

    //将命令的发送者绑定到命令的接收器上面来
    //做两个菜发送两条命令
    public function addCommand(Command $mealcommand,Command $drinkcommand){
        $this->mealcommand = $mealcommand;
        $this->drinkcommand = $drinkcommand;
    }

    public function callmeal(){
        $this->mealcommand->execute();
    }

    public function calldrink(){
        $this->drinkcommand->execute();
    }
}



//现在完成整个过程
//客户给服务员发送命令
$control = new cookControl;
//厨师
$cook = new cook;
//给厨师发送一个命令(给我做一个番茄炒鸡蛋)
$mealcommand = new MealCommand($cook);
//给厨师发送一个命令(给我做一个紫菜蛋花汤)
$drinkcommand = new DrinkCommand($cook);
//将这两个命令告诉给服务员
$control->addCommand($mealcommand,$drinkcommand);
//服务员让厨师去做番茄炒鸡蛋
$control->callmeal();
//服务员让厨师去做紫菜蛋花汤
$control->calldrink();



